package cn.tedu.collection.list;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class ListText {
    public static void main(String[] args) {
        //
        ListArray list=new ListArray();
        list.add("abc");
        list.add("bc");
        list.add("ac");
        list.add("ab");
        list.add("1abc");
        list.add(0,"123");
        list.remove("ab");
        System.out.println(list.subList(0,3));
        System.out.println(list);

    }
}

//用数组实现ArrayList
class ListArray{
    //声明存储数据的数组---私有化属性
    private String[] data;

    //定义变量表示数组下标/元素个数
    private int size=0;

    //无参构造---默认初始容量为10
    public ListArray(){
        data=new String[10];
    }
    //有参构造---指定初始容量
    public ListArray(int initcapcity){
        //数组长度不能为负数
        if (initcapcity >= 0)
            data = new String[initcapcity];
        else
            //反馈问题
            throw new IllegalArgumentException
                    ("Initcapcity"+initcapcity);
    }

    //扩容的方法
    public void grow(){
        //保证可以进行正常的扩容
        if (data.length <= 1)
            data = Arrays.copyOf
                    (data, data.length + 1);
        else
            data = Arrays.copyOf
                    (data, data.length + (data.length >> 1));
    }

    //下标是否越界的问题
    public void isOut(int index){
        //判断下标是否越界
        if(index<0||index>=size)
            //反馈问题
            throw new IllegalArgumentException
                    ("Index"+index);
    }

    //添加元素---末尾添加
    public void add(String str){
        //判断是否需要扩容
        if(size>=data.length)
            grow();

        data[size++]=str;
    }

    //插入元素
    public void add(int index,String str){
        //判断下标是否越界
        if(index<0||index>size)
            //反馈问题
            throw new IllegalArgumentException
                    ("Index"+index);

        //判断是否需要扩容
        if(size>=data.length)
            grow();

        //元素依次往后挪到
        /*for(int i=size-1;i>=index;i--){
            //把前面的元素给后面来赋值--相邻
            data[i+1]=data[i];
        }*/
        //本数组之间内容的复制
        System.arraycopy
                (data,index,data,index+1,(size-index));


        //插入指定元素
        data[index]=str;
        //记录元素个数
        size++;
    }


    //根据下标来删除
    public void remove(int index){
        //判断下标是否越界
        isOut(index);


        //依次往前挪动元素
        /*for(int i=index;i<size-1;i++){
            //把后面的元素给前面元素进行赋值
            data[i]=data[i+1];
        }*/
        System.arraycopy
                (data,index+1,data,index,(size-index-1));

        //计算元素个数
        size--;
    }

    //根据指定内容来删除
    public void remove(String str){
        //调用方法返回指定内容的下标值
        int index=indexOf(str);
        //判断返回的下标值是否是-1
        if(index!=-1){
            remove(index);
        }
    }


    //返回指定内容第一次出现的下标值
    public int indexOf(String str){
        //根据size来遍历所有的元素
        for(int i=0;i<size;i++){
            //判断指定内容是否和数组元素相等
            //null null
            if(data[i]==str||data[i]!=null&&data[i].equals(str)){
                return i;
            }
        }
        //如果集合中没有指定内容
        return -1;
    }


    //清空列表
    public void clear(){
        size=0;
    }


    //判断是否包含指定内容
    public boolean contains(String str){
        return indexOf(str)!=-1;
    }


    //返回指定下标对应的元素值
    public String get(int index){
        //下标越界问题
        isOut(index);

        //
        return data[index];
    }

    //判断是否是空列表
    public boolean isEmpty(){
        return size==0;
    }

    //替换指定元素
    public void set(int index,String str){
        //下标越界问题
        isOut(index);

        //替换
        data[index]=str;
    }

    //返回元素个数
    public int size(){
        return size;
    }

    //截取子列表---新的列表对象
    public ListArray subList(int fromIndex,int toIndex){
        //下标越界的问题
        isOut(fromIndex);
        isOut(toIndex);
        //判断两个下标的大小关系
        if(fromIndex>toIndex){
            throw new IllegalArgumentException("FromIndex"+fromIndex
                    +"ToIndex"+toIndex);
        }
        //截取元素个数
        int count=toIndex-fromIndex;
        //创建新的列表对象--子列表
        //指定新的列表对象的容量就是截取元素的个数
        ListArray list=new ListArray(count);
        //把原数组里的元素复制到新列表对象的新数组中
        System.arraycopy(data,fromIndex,list.data,0,count);
        //把复制的元素个数赋值给新列表对象的size
        list.size=count;
        //
        return list;

    }


    //重写toString方法
    public String toString(){
        //创建对象
        StringBuilder sb=new StringBuilder("[");
        //遍历数组元素---size
        for(int i=0;i<size;i++){
            sb.append(data[i]).append(", ");
        }
        //转成String类型
        String s=sb.toString();

        //有元素就会出现逗号和空格才能进行截取
        if(size>0)
        s=s.substring(0,s.length()-2);

        //
        return s+="]";

    }



}










